package com.tanhua.common.service;

import com.aliyun.oss.OSSClient;
import com.tanhua.common.config.AliyunOSSConfig;
import com.tanhua.common.vo.PicUploadResult;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;

@Service
public class PicUploadService {
    // 允许上传的格式 -> string数组后面可以遍历比对
    private static final String[] IMAGE_TYPE =
            new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"};

    @Autowired
    private OSSClient ossClient;

    @Autowired
    private AliyunOSSConfig aliyunOSSConfig;

    /**
     * 图片上传
     * @param multipartFile
     * @return
     */
    public PicUploadResult upload(MultipartFile multipartFile) {

        //创建一个返回结果的对象
        PicUploadResult result = new PicUploadResult();

        //对图片格式的校验，默认false
        boolean isLegal = false;

        for (String s : IMAGE_TYPE) {
            //boolean endsWithIgnoreCase(CharSequence str, CharSequence suffix) ->
            // 如果在str末尾找到和suffix匹配的字符，则返回True。否则，返回False
            if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(),s)){
                isLegal = true;
                break;
            }
        }

        //判断对图片格式的校验是否通过
        if (!isLegal){
            //未通过,设置返回对象的状态信息为“error”
            result.setStatus("error");
            return result;
        }

        //获得新的文件名
        String newFileName = getFilePath(multipartFile.getOriginalFilename());

        try {
            //上传到阿里云
            ossClient.putObject(
                    //设置OSS的桶名称
                    aliyunOSSConfig.getBucketName(),
                    //路径名+文件名
                    newFileName,
                    //存储文件的io流
                    new ByteArrayInputStream(multipartFile.getBytes())
            );
        } catch (Exception e) {
            e.printStackTrace();
            //上传失败,封装结果对象状态为“error”
            result.setStatus("error");
            return result;
        }

        //上传成功
        //设置状态码“done”
        result.setStatus("done");
        //设置OOS的网络前缀，拼接上存储图片的路径名+文件名
        result.setName(aliyunOSSConfig.getUrlPrefix()+newFileName);
        //将当前时间封装到结果对象的uid中
        result.setUid(String.valueOf(System.currentTimeMillis()));

        //返回结果对象
        return result;


    }

    /**
     * 给图片设置新的路径
     * @param fileName
     * @return
     */
    private String getFilePath(String fileName){
        //1. 获得当前时间
        DateTime dateTime = new DateTime();
        //2.拼接
        //images/yyyy/MM/dd/****.jpg
        return "images/"+dateTime.toString("yyyy")
                +"/"+dateTime.toString("MM")
                +"/"+dateTime.toString("dd")
                +"/"+System.currentTimeMillis()
                + RandomUtils.nextInt(100,9999)+"."
                + StringUtils.substringAfterLast(fileName,".");
                //substringAfterLast(String str, String separator) -> 获得str字符串以separator分割的最后一个子串
    }
}
